package com.example.config;

import com.example.handler.BootNettyChannelInboundHandlerAdapter;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.codec.xml.XmlDecoder;
import io.netty.handler.codec.xml.XmlFrameDecoder;
import io.netty.util.CharsetUtil;

/**
 * @ClassName: BootNettyChannelInitializer
 * @Author : 13736
 * @Date :2023/7/8  10:10
 * @Description: TODO
 * @Version :1.0
 */
/*一个ChannelHandler如果使用了@Sharable注解，就可以只在bootstrap中创建一个实例，
它就可以被添加到一或多个pipeline中且不存在竞争，这样可以减少同一类handler的new和GC，
节省资源，提高效率 不过要注意这个ChannelHandler必须是无成员变量的，如果该handler中有成员变量，
可以考虑将成员变量修改为AttributeKey：*/

@ChannelHandler.Sharable
public class BootNettyChannelInitializer<SocketChannel> extends ChannelInitializer<Channel> {
    @Override
    protected void initChannel(Channel channel) throws Exception {
        // 带编码
//        channel.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
//        channel.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
        channel.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
        channel.pipeline().addLast("decoder", new XmlFrameDecoder(1048576));
        channel.pipeline().addLast(new BootNettyChannelInboundHandlerAdapter());
    }
}
